Ad Hoc多相
Ad hoc polymorphism
「複数の異なる(型の)関数」を「同一の名前」で呼んでいる
実体は複数あるが記号が同じ
ライブラリが提供している型や型クラスに対して、その実装を直接触らなくてもoverloadすることが可能
アドホック多相をより強力にしたもの
以下のような型をとるようなとある関数sumがあったとして、
型ごとに実装を変えられる
この「型ごと」の型同士には互いに関係はない
code:hs
sum :: a -> a -> a
実装というか意味?が異なる
例えば+演算子
(+) :: Int -> Int -> Intの場合は、「加法」を意味する
(+) :: String -> String -> Stringの場合は、文字列の連結を意味する
適当にそれっぽく人間が定義を与えただけ
show型クラスに、特定の型をインスタンスにする例がわかりやすいかもしれない
data Human = Human Name Ageという自作の型をどうshowするかが決められていない
例えば以下の様なコードを実行したときに、どう出力されるかは定義されていない
code:hs
data Human = Human Name Age
let h = Human "tanaka" 42
show h -- > ???
Human "tanaka" 42かもしれないし、{Human: {name: "tanaka", age: 42}}かもしれない
この定義を型クラスを用いて行うことで自分で定義できる
code:hs
instance Show Human where
show (Human name age) = name ++ " is " ++ show age ++ " years old"
let h = Human "tanaka" 42
show h -- > "tanaka is 42 years old"
Intに対してshow 2とするのと同じように、自作型Humanに対してshowを実行しているだけだが、どのように定義されているかは型ごとに異なっている
異なる型に対して同じ名前の関数を利用できるが、中身は異なる
ex.
+に対して、数値同士の計算、文字列同士の連結の意味をもたせる
数値といってもintやfloatなどがあるがそれらに対しても気にせずに同じ関数(+)を使えている
OCamlはアドホック多相を実現する機構がなく、型によって演算子を変える必要がある
+と+.とか
参考